"""
生成器是特殊的迭代器
"""

# 直接生成列表但是会占用大量空间
nums = [x * 2 for x in range(10)]
print(nums)

# 只要将中括号换成大括号便生成nums迭代器对象而不是列表节约空间
nums2 = (x * 2 for x in range(10))
for n in nums2:
    print(n)


# 使用函数创建生成器，如果一个函数有yield，此时不是调用函数而是创建一个生成器模板
# 当调用函数时则返回一个生成器
def create_num(all_num):
    # 定义变量并赋值
    a, b = 0, 1
    current_index = 0
    while current_index < all_num:
        # print(a)
        # 使用yield，此时不在是普通函数而是一个生成器模板
        # 代码执行到yield时会停止执行返回yield后的值
        # return也会停止函数执行下次执行时还从开头执行
        # 而yield会暂停函数执行返回结果a，下次再执行(使用send、next启动函数)则从yield后面开始执行
        value = yield a
        print("send传过来的参数为：", value)
        a, b = b, a + b
        current_index += 1

    return "create_num"


res = create_num(10)

print(next(res))
# 给生成器传值用于在生成器做一些判断，但是第一次不能调用，如果要调用可以传None
ret = res.send("aa")
print(ret)
# 使用while循环迭代res会产生异常
# while True:
#     try:
#         obj = next(res)
#         print(obj)
#     except Exception as ret:
#         # 生成器返回值封装在value中
#         print(ret.value)
#         break
# 使用next调用生成器生成一个数值
# print(next(res))
# for i in res:
#     print("i=", i)

# 生成器对象使用next函数取值，也可以使用send方法取值，send方法可以传值
